package DAO;

import Entidad.EstacionTrabajo;
import Entidad.ReservaEstacion;
import Entidad.Usuario;
import Singletons.Mensajes;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;

public class ReservaEstacionDAO {

    /**
     * <p> devuelve un arrayList con las reservas de estacion
     * que tengan como estacion la estacion con id iual al
     * parametro de este metodo</p>
     * @param idEstacion
     * @return ArrayList<ReservaEstacion>
     */
    public ArrayList<ReservaEstacion> lista(EntityManager em)throws PersistenceException{
        ArrayList<ReservaEstacion> lista = new ArrayList<ReservaEstacion>();
        try{
            Query consulta = em.createQuery("SELECT u FROM ReservaEstacion u");
            List listaSalas=consulta.getResultList();
            for(Object r:listaSalas)
                lista.add((ReservaEstacion)r);
        }catch(NoResultException e){
            return new ArrayList<ReservaEstacion>();
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return lista;
    }

    public void Crear(ReservaEstacion registro, EntityManager em) {
        em.persist(registro);
    }

    public void Crear(ReservaEstacion registro, Usuario u, EstacionTrabajo et, EntityManager em) {
        registro.setUsuario(em.merge(u));
        registro.setEstacion(em.merge(et));
        em.persist(registro);
    }

    public ReservaEstacion Buscar(Long id,EntityManager em) throws PersistenceException {
        ReservaEstacion reserva;
        try{
            reserva=em.find(ReservaEstacion.class, id);
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return reserva;
    }

    public boolean actualizar(ReservaEstacion re,EntityManager em){
        boolean flag=true;
        try{
            em.merge(re);
        }catch(Exception e){
            flag=false;
        }
        return flag;
    }
    /**
     * <p>Busca y retorna una lista de reservas de la estacion identificada con el id indicado.</p>
     * @param id Long con el id de la estacion.
     * @param em EntityManager que se encarga de la conexion con la base de datos.
     * @return Lista de reservas de la estacion con el id pasado como argumento.
     * @throws PersistenceException
     */
    public ArrayList<ReservaEstacion> listaReservasEstacion(long id,EntityManager em) throws PersistenceException {
        ArrayList<ReservaEstacion> lista;
        try{
            Query query=em.createQuery("SELECT u FROM ReservaEstacion u WHERE u.estacion.id=:id").setParameter("id",id);
            List listaSalas=query.getResultList();
            lista=new ArrayList<ReservaEstacion>();
            for(Object r:listaSalas)
                lista.add((ReservaEstacion)r);
        }catch(NoResultException e){
            lista=new ArrayList<ReservaEstacion>();
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return lista;
    }

    /**
     * <p>Busca y retorna una lista de reservas de una estacion de la sala identificada con el id indicado.</p>
     * @param idSala Long con el id de la sala
     * @param em EntityManager que se encarga de la conexion con la base de datos.
     * @return Lista de reservas de las estaciones de la sala con el id pasado como argumento.
     * @throws PersistenceException
     */
    public ArrayList<ReservaEstacion> listaReservasEstacionPorSala(long idSala,EntityManager em) throws PersistenceException {
        ArrayList<ReservaEstacion> lista;
        try{
            Query query=em.createQuery("SELECT u FROM ReservaEstacion u WHERE u.estacion.sala.id=:idSala").setParameter("idSala",idSala);
            List listaSalas=query.getResultList();
            lista=new ArrayList<ReservaEstacion>();
            for(Object r:listaSalas)
                lista.add((ReservaEstacion)r);
        }catch(NoResultException e){
            lista=new ArrayList<ReservaEstacion>();
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return lista;
    }
    /**
     * <p>Busca y retorna una lista de reservas un usuario con el id indicado.</p>
     * @param idSala Long con el id de la sala
     * @param em EntityManager que se encarga de la conexion con la base de datos.
     * @return Lista de reservas de las estaciones del usuario con el id pasado como argumento.
     * @throws PersistenceException
     */
    public ArrayList<ReservaEstacion> listaReservasEstacionPorUsuario(long cedulaUsuario,EntityManager em) throws PersistenceException {
        ArrayList<ReservaEstacion> lista= new ArrayList<ReservaEstacion>();
        try{
            Query query=em.createQuery("SELECT u FROM ReservaEstacion u WHERE u.usuario.cedula=:cedulaUsuario").setParameter("cedulaUsuario",cedulaUsuario);
            List listaSalas=query.getResultList();
            lista=new ArrayList<ReservaEstacion>();
            for(Object r:listaSalas)
                lista.add((ReservaEstacion)r);
        }catch(NoResultException e){
            lista=new ArrayList<ReservaEstacion>();
        }catch(Exception e){
            throw new PersistenceException(Mensajes.ERROR_CONEXION_BD);
        }
        return lista;
    }

    public void eliminar(long id, EntityManager em)throws  PersistenceException {
        //public void borrar(long id,EntityManager em)throws PersistenceException,Exception {
        //Administrador emp = em.find(Administrador.class, id);
        //em.remove(emp);
        ReservaEstacion re = em.find(ReservaEstacion.class, id);
        em.remove(re);

    }
    

}